#include "main.h"


/********************************************************
**函数名：	BSW_GPIO_MUX_CONFIG
**功能：		初始化端口的复用功能
**输入参数：u8_Port 选定需要配置的引脚
**					u32_Pin 设置的PIN脚 
**					mux设置功能
**返回值：	无
**注意：		例如: 设置PTE_8的复用功能2 - FTM0_CH6
**								Bsw_Port_E,PIN8_IDX,PORT_MUX_ALT2
*********************************************************/
void BSW_GPIO_MUX_CONFIG(uint8_t u8_Port,uint32_t u32_Pin,port_mux_t mux)
{
	PORT_Type *u32_Port_base;
	clock_names_t clockName;
	
	switch(u8_Port)											/*根据宏定义选择指定的端口*/
	{
		case Bsw_Port_A:
		{
			u32_Port_base = PORTA;
			clockName = PORTA_CLK;
			break;
		}
		case Bsw_Port_B:
		{
			u32_Port_base = PORTB;
			clockName = PORTB_CLK;
			break;
		}
		case Bsw_Port_C:
		{
			u32_Port_base = PORTC;
			clockName = PORTC_CLK;
			break;
		}
		case Bsw_Port_D:
		{
			u32_Port_base = PORTD;
			clockName = PORTD_CLK;
			break;
		}
		case Bsw_Port_E:
		{
			u32_Port_base = PORTE;
			clockName = PORTE_CLK;
			break;
		}
	}
	PCC_SetClockMode(PCC, clockName, true);
	PINS_SetMuxModeSel(u32_Port_base,u32_Pin,mux);			/*设置端口功能*/
}


/********************************************************
**函数名：		BSW_GPIO_IRQ_CONFIG
**功能：		端口的中断配置    ** DMA也从此处配置
**输入参数：	u8_Port 选定需要配置的引脚
**			u32_Pin 设置的PIN脚
**			intConfig 中断配置
**返回值：		无
**注意：		例如: 设置PTE_8的复用功能2 - FTM0_CH6
**			Bsw_Port_E,PIN8_IDX,PORT_MUX_ALT2
**			intConfig  PORT_DMA_INT_DISABLED
*********************************************************/
void BSW_GPIO_IRQ_CONFIG(uint8_t u8_Port,uint32_t u32_Pin,port_interrupt_config_t intConfig)
{
	PORT_Type *u32_Port_base;
	switch(u8_Port)											/*根据宏定义选择指定的端口*/
	{
		case Bsw_Port_A:
		{
			u32_Port_base = PORTA;
			break;
		}
		case Bsw_Port_B:
		{
			u32_Port_base = PORTB;
			break;
		}
		case Bsw_Port_C:
		{
			u32_Port_base = PORTC;
			break;
		}
		case Bsw_Port_D:
		{
			u32_Port_base = PORTD;
			break;
		}
		case Bsw_Port_E:
		{
			u32_Port_base = PORTE;
			break;
		}
	}
	PINS_DRV_SetPinIntSel(u32_Port_base,u32_Pin,intConfig);		/*关闭引脚的中断/DMA请求*/
}



/********************************************************
**函数名：	BSW_GPIO_Direction
**功能：		设置GPIO的输入输出模式
**输入参数：GPIO_Type 指定的端口
**					u32_Pin 设置的PIN脚 
**					Direction 设置端口的方向
**返回值：	无
**注意：		例如: PTA8 设置为输出 PTA PIN8_IDX 1
*********************************************************/
void BSW_GPIO_Direction(GPIO_Type *u32_Gpio_base,uint32_t u32_Pin,uint8_t Direction)
{ 
	

	if(Direction)										/*设置为输出模式*/
	{
		u32_Gpio_base->PDDR |= (1<<u32_Pin);
	}
	else														/*设置为输入模式*/
	{
		u32_Gpio_base->PDDR &= ~(1<<u32_Pin);
	}

}

/********************************************************
**函数名：	BSW_GPIO_SetBits
**功能：		设置指定的PIN脚输出高
**输入参数：GPIO_Type GPIO端口地址,u32_Pin 设置的PIN脚
**返回值：	无
**注意：		例如 	置位PTD15为高电平
**					GPIO_Type: 	PTD	     u32_Pin:				15
*********************************************************/
void BSW_GPIO_SetBits(GPIO_Type *base, uint32_t u32_Pin)
{
	base->PSOR |= 1 << u32_Pin; 			/* base->PDOR |= 1 << u32_Pin; */
}

/********************************************************
**函数名：	BSW_GPIO_ResetBits
**功能：		设置指定的PIN脚输出低
**输入参数：GPIO_Type GPIO端口地址,u32_Pin 设置的PIN脚
**返回值：	无
**注意：		例如 	复位PTD15为低电平
**					GPIO_Type: 	PTD	     u32_Pin:				15
*********************************************************/
void BSW_GPIO_ResetBits(GPIO_Type *base, uint32_t u32_Pin)
{
	base->PCOR |= 1 << u32_Pin; 		/*base->PDOR &= ~(1 << u32_Pin);*/
}


/********************************************************
**函数名：	BSW_GPIO_OPPOSITE
**功能：		翻转指定引脚的电平
**输入参数：GPIO_Type GPIO端口地址,u32_Pin 设置的PIN脚
**返回值：	无
**注意：		例如 	翻转PTD15的电平
**					GPIO_Type: 	PTD	     u32_Pin:				15
*********************************************************/
void BSW_GPIO_OPPOSITE(GPIO_Type *base, uint32_t u32_Pin)
{
	base->PTOR |= 1 << u32_Pin;
}




uint8_t BSW_GPIO_ReadBit(GPIO_Type *base, uint32_t u32_Pin)
{
	base ->PIDR = 0;
	return (((base->PDIR)>> u32_Pin) &0x01);
}

